<?
require 'ParserAbstract.php';
class PikabuParse extends ParserAbstract{
	
	public function __construct($url = 'http://pikabu.ru/index.php'){		
		parent::__construct( $url );
		$body = $this->_page;
		$body = mb_convert_encoding( $body, 'utf-8', 'windows-1251' );
		$body = mb_convert_encoding( $body, 'HTML-ENTITIES', 'utf-8' );
		$this->_page = $body;
		$this->parseTablePost();	
	}
	
	/**
	 * Извлекаем таблицу с постами
	 */
	public function parseTablePost(){
	
        // вырезаем всё до div'a с постами
		$stories_container = strpos($this->_page, '<div id="stories_container">');

		$this->_page = substr($this->_page, $stories_container);

        // вырезаем всё лишнее после div'a с постами
		$tw_loader = strpos($this->_page, 'id="tw_loader"');

		$this->_page = substr($this->_page, 0, $tw_loader);
		
	}
	
	public function parsePosts($_tag){
	
		$dom = new Zend_Dom_Query($this->_page);
        
		$tables = $dom->query('table');
		
		$posts = array();
		
		// всего записей
		$_all = 0;
		
		// новых записей
		$_new = 0;
		
		// обновленных записей
		$_update = 0;
        
        // поехали
		foreach($tables as $key => $table){
        
			$tid = $table->getAttribute('id');
            
            // если в таблице не находим аттирбут id то пропускаем
			if (!$tid) continue;
            
            // если id не содержит  story_table пропускаем
			if (substr($tid, 0, 12) != 'story_table_') continue;		
				
			++$_all;
			
            // устанавливаем id поста
			$postId = substr($tid, 12);
			
			$postHtml = $this->getInnerHtml($table);
			
			$postHtml = mb_convert_encoding( $postHtml, 'HTML-ENTITIES', 'utf-8');
			
			$post = new Zend_Dom_Query($postHtml);
            
			// Проверяем, является ли пост - картинкой и если она не .gif
			$type = $post->query('img.showpic')->current();
			
			if(!isset($type->nodeValue) || !preg_match('/\.jpg$/i', $type->getAttribute('name')) && !preg_match('/\.jpeg$/i', $type->getAttribute('name')) &&  !preg_match('/\.png$/i', $type->getAttribute('name'))){
				continue;
			}
			
			// Получаем рейтинг поста
			$rate = $post->query('li.curs')->current()->nodeValue;
            
            // Получаем дату публикации поста
			$info = $this->getInnerHtml( $post->query('div.info span')->current() );
            
            preg_match('/\<a(.*)\>(.*)\<\/a\>(.*)\<a(.*)\>(.*)\<\/a\>(.*)\<a(.*)\>(.*)\<\/a\>/isU', $info, $m);
            
            $date = trim($m[6]);
            $date = substr($date, 0, strlen($date)-3);
            //$date = str_replace(array('часа назад', 'часов назад', 'час назад'), 'hours', $date);
            
            // ищем часы или минуты
            preg_match('/([0-9]*)\s((час*)|(мин*))/is', $date, $dr);
            // определяем число и тип (час или минута)
            $dateCurrentNumber = intval( $dr[1] );
			$date_time_array = getdate(time());

			$hours = $date_time_array['hours'];
			$minutes = $date_time_array['minutes'];
			$seconds = $date_time_array['seconds'];
			$month = $date_time_array['mon'];
			$day = $date_time_array['mday'];
			$year = $date_time_array['year'];
			
            if( $dr[2] === 'час' ){
				$date = mktime($hours-$dateCurrentNumber,$minutes,$seconds,$month,$day,$year);
            }elseif( $dr[2] === 'мин' ){
				$date = mktime($hours,$minutes-$dateCurrentNumber,$seconds,$month,$day,$year);
            }
            
            // ищем в базе пост по ID
            $srow = $this->_model->select();
            $srow->where('external_id = ?', $postId)
                    ->where('source_id', 1);
            $row = $this->_model->fetchRow($srow);
            if ($row) {
                // если находим то обновляем рейтинг и пропускаем
                $this->_model->update(
                    array('external_rating' => $rate, 'external_created_at' => date('Y-m-d H:i:s',$date)),
                    array($this->_model->getAdapter()->quoteInto('source_id = ?', 1), $this->_model->getAdapter()->quoteInto('external_id = ?', $postId))
                );
                ++$_update;
                continue;
            
            }
			
			// Получаем заголовок поста
			$caption = $post->query('a.story_link')->current()->nodeValue;
			
			// Получаем ссылку на пост
			$postLink = $post->query('a.story_link')->current()->getAttribute('href');
			
			// Получаем описание поста
			$description = $post->query('div.short')->current();
			
			// Получаем имя категории
            $tag = $m[8];
			$post = array(
                'type' => 'image',
                'external_id' => $postId,
				'source_id' => 1,
				'title' => $caption,
				'external_url' => $postLink,
                'external_rating' => $rate,
				'description' => (isset($description->nodeValue)) ? $description->nodeValue : '',
				'image_url' => $type->getAttribute('name'),
				'external_created_at' =>  date('Y-m-d H:i:s',$date),
                            'created_at' => date('Y-m-d H:i:s', time()),
				'tag' => $tag . ', '. $_tag
			);     
            $this->_model->AddPost($post);	
			++$_new;
		}
        
		$a = ActivityPeer::getInstance()->crone_work('Pikabu', $this->_url, $_all, $_new, $_update);
	}
	
}
